/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.collections.iterators; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; import junit.framework.Test; import junit.framework.TestSuite; import junit.textui.TestRunner; import org.apache.commons.collections.IteratorUtils; import org.apache.commons.collections.Transformer; /** * Testcase. * * @version $Revision: 646780 $ $Date: 2008-04-10 13:48:07 +0100 (Thu, 10 Apr 2008) $ * * @author Stephen Colebourne */ public class TestObjectGraphIterator extends AbstractTestIterator { protected String[] testArray = { "One", "Two", "Three", "Four", "Five", "Six" }; protected List list1 = null; protected List list2 = null; protected List list3 = null; protected List iteratorList = null; public TestObjectGraphIterator(String testName) { super(testName); } public static void main(String[] args) { TestRunner.run(suite()); } public static Test suite() { return new TestSuite(TestObjectGraphIterator.class); } public void setUp() { list1 = new ArrayList(); list1.add("One"); list1.add("Two"); list1.add("Three"); list2 = new ArrayList(); list2.add("Four"); list3 = new ArrayList(); list3.add("Five"); list3.add("Six"); iteratorList = new ArrayList(); iteratorList.add(list1.iterator()); iteratorList.add(list2.iterator()); iteratorList.add(list3.iterator()); } //----------------------------------------------------------------------- public Iterator makeEmptyIterator() { ArrayList list = new ArrayList(); return new ObjectGraphIterator(list.iterator(), null); } public Iterator makeFullIterator() { return new ObjectGraphIterator(iteratorList.iterator(), null); } //----------------------------------------------------------------------- public void testIteratorConstructor_null1() { Iterator it = new ObjectGraphIterator(null); assertEquals(false, it.hasNext()); try { it.next(); fail(); } catch (NoSuchElementException ex) { } try { it.remove(); fail(); } catch (IllegalStateException ex) { } } public void testIteratorConstructor_null_next() { Iterator it = new ObjectGraphIterator(null); try { it.next(); fail(); } catch (NoSuchElementException ex) { } } public void testIteratorConstructor_null_remove() { Iterator it = new ObjectGraphIterator(null); try { it.remove(); fail(); } catch (IllegalStateException ex) { } } //----------------------------------------------------------------------- public void testIteratorConstructorIteration_Empty() { List iteratorList = new ArrayList(); Iterator it = new ObjectGraphIterator(iteratorList.iterator()); assertEquals(false, it.hasNext()); try { it.next(); fail(); } catch (NoSuchElementException ex) { } try { it.remove(); fail(); } catch (IllegalStateException ex) { } } public void testIteratorConstructorIteration_Simple() { List iteratorList = new ArrayList(); iteratorList.add(list1.iterator()); iteratorList.add(list2.iterator()); iteratorList.add(list3.iterator()); Iterator it = new ObjectGraphIterator(iteratorList.iterator()); for (int i = 0; i < 6; i++) { assertEquals(true, it.hasNext()); assertEquals(testArray[i], it.next()); } assertEquals(false, it.hasNext()); try { it.next(); fail(); } catch (NoSuchElementException ex) { } } public void testIteratorConstructorIteration_SimpleNoHasNext() { List iteratorList = new ArrayList(); iteratorList.add(list1.iterator()); iteratorList.add(list2.iterator()); iteratorList.add(list3.iterator()); Iterator it = new ObjectGraphIterator(iteratorList.iterator()); for (int i = 0; i < 6; i++) { assertEquals(testArray[i], it.next()); } try { it.next(); fail(); } catch (NoSuchElementException ex) { } } public void testIteratorConstructorIteration_WithEmptyIterators() { List iteratorList = new ArrayList(); iteratorList.add(IteratorUtils.EMPTY_ITERATOR); iteratorList.add(list1.iterator()); iteratorList.add(IteratorUtils.EMPTY_ITERATOR); iteratorList.add(list2.iterator()); iteratorList.add(IteratorUtils.EMPTY_ITERATOR); iteratorList.add(list3.iterator()); iteratorList.add(IteratorUtils.EMPTY_ITERATOR); Iterator it = new ObjectGraphIterator(iteratorList.iterator()); for (int i = 0; i < 6; i++) { assertEquals(true, it.hasNext()); assertEquals(testArray[i], it.next()); } assertEquals(false, it.hasNext()); try { it.next(); fail(); } catch (NoSuchElementException ex) { } } public void testIteratorConstructorRemove() { List iteratorList = new ArrayList(); iteratorList.add(list1.iterator()); iteratorList.add(list2.iterator()); iteratorList.add(list3.iterator()); Iterator it = new ObjectGraphIterator(iteratorList.iterator()); for (int i = 0; i < 6; i++) { assertEquals(testArray[i], it.next()); it.remove(); } assertEquals(false, it.hasNext()); assertEquals(0, list1.size()); assertEquals(0, list2.size()); assertEquals(0, list3.size()); } //----------------------------------------------------------------------- public void testIteration_IteratorOfIterators() { List iteratorList = new ArrayList(); iteratorList.add(list1.iterator()); iteratorList.add(list2.iterator()); iteratorList.add(list3.iterator()); Iterator it = new ObjectGraphIterator(iteratorList.iterator(), null); for (int i = 0; i < 6; i++) { assertEquals(true, it.hasNext()); assertEquals(testArray[i], it.next()); } assertEquals(false, it.hasNext()); } public void testIteration_IteratorOfIteratorsWithEmptyIterators() { List iteratorList = new ArrayList(); iteratorList.add(IteratorUtils.EMPTY_ITERATOR); iteratorList.add(list1.iterator()); iteratorList.add(IteratorUtils.EMPTY_ITERATOR); iteratorList.add(list2.iterator()); iteratorList.add(IteratorUtils.EMPTY_ITERATOR); iteratorList.add(list3.iterator()); iteratorList.add(IteratorUtils.EMPTY_ITERATOR); Iterator it = new ObjectGraphIterator(iteratorList.iterator(), null); for (int i = 0; i < 6; i++) { assertEquals(true, it.hasNext()); assertEquals(testArray[i], it.next()); } assertEquals(false, it.hasNext()); } //----------------------------------------------------------------------- public void testIteration_RootNull() { Iterator it = new ObjectGraphIterator(null, null); assertEquals(false, it.hasNext()); try { it.next(); fail(); } catch (NoSuchElementException ex) { } try { it.remove(); fail(); } catch (IllegalStateException ex) { } } public void testIteration_RootNoTransformer() { Forest forest = new Forest(); Iterator it = new ObjectGraphIterator(forest, null); assertEquals(true, it.hasNext()); assertSame(forest, it.next()); assertEquals(false, it.hasNext()); try { it.next(); fail(); } catch (NoSuchElementException ex) { } } public void testIteration_Transformed1() { Forest forest = new Forest(); Leaf l1 = forest.addTree().addBranch().addLeaf(); Iterator it = new ObjectGraphIterator(forest, new LeafFinder()); assertEquals(true, it.hasNext()); assertSame(l1, it.next()); assertEquals(false, it.hasNext()); try { it.next(); fail(); } catch (NoSuchElementException ex) { } } public void testIteration_Transformed2() { Forest forest = new Forest(); forest.addTree(); forest.addTree(); forest.addTree(); Branch b1 = forest.getTree(0).addBranch(); Branch b2 = forest.getTree(0).addBranch(); Branch b3 = forest.getTree(2).addBranch(); Branch b4 = forest.getTree(2).addBranch(); Branch b5 = forest.getTree(2).addBranch(); Leaf l1 = b1.addLeaf(); Leaf l2 = b1.addLeaf(); Leaf l3 = b2.addLeaf(); Leaf l4 = b3.addLeaf(); Leaf l5 = b5.addLeaf(); Iterator it = new ObjectGraphIterator(forest, new LeafFinder()); assertEquals(true, it.hasNext()); assertSame(l1, it.next()); assertEquals(true, it.hasNext()); assertSame(l2, it.next()); assertEquals(true, it.hasNext()); assertSame(l3, it.next()); assertEquals(true, it.hasNext()); assertSame(l4, it.next()); assertEquals(true, it.hasNext()); assertSame(l5, it.next()); assertEquals(false, it.hasNext()); try { it.next(); fail(); } catch (NoSuchElementException ex) { } } public void testIteration_Transformed3() { Forest forest = new Forest(); forest.addTree(); forest.addTree(); forest.addTree(); Branch b1 = forest.getTree(1).addBranch(); Branch b2 = forest.getTree(1).addBranch(); Branch b3 = forest.getTree(2).addBranch(); Branch b4 = forest.getTree(2).addBranch(); Branch b5 = forest.getTree(2).addBranch(); Leaf l1 = b1.addLeaf(); Leaf l2 = b1.addLeaf(); Leaf l3 = b2.addLeaf(); Leaf l4 = b3.addLeaf(); Leaf l5 = b4.addLeaf(); Iterator it = new ObjectGraphIterator(forest, new LeafFinder()); assertEquals(true, it.hasNext()); assertSame(l1, it.next()); assertEquals(true, it.hasNext()); assertSame(l2, it.next()); assertEquals(true, it.hasNext()); assertSame(l3, it.next()); assertEquals(true, it.hasNext()); assertSame(l4, it.next()); assertEquals(true, it.hasNext()); assertSame(l5, it.next()); assertEquals(false, it.hasNext()); try { it.next(); fail(); } catch (NoSuchElementException ex) { } } //----------------------------------------------------------------------- static class LeafFinder implements Transformer { public Object transform(Object input) { if (input instanceof Forest) { return ((Forest) input).treeIterator(); } if (input instanceof Tree) { return ((Tree) input).branchIterator(); } if (input instanceof Branch) { return ((Branch) input).leafIterator(); } if (input instanceof Leaf) { return input; } throw new ClassCastException(); } } //----------------------------------------------------------------------- static class Forest { List trees = new ArrayList(); Tree addTree() { trees.add(new Tree()); return getTree(trees.size() - 1); } Tree getTree(int index) { return (Tree) trees.get(index); } Iterator treeIterator() { return trees.iterator(); } } static class Tree { List branches = new ArrayList(); Branch addBranch() { branches.add(new Branch()); return getBranch(branches.size() - 1); } Branch getBranch(int index) { return (Branch) branches.get(index); } Iterator branchIterator() { return branches.iterator(); } } static class Branch { List leaves = new ArrayList(); Leaf addLeaf() { leaves.add(new Leaf()); return getLeaf(leaves.size() - 1); } Leaf getLeaf(int index) { return (Leaf) leaves.get(index); } Iterator leafIterator() { return leaves.iterator(); } } static class Leaf { String colour; String getColour() { return colour; } void setColour(String colour) { this.colour = colour; } } }